home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / nieuûytki / macwb 0.2up / src / main.c < prev    next >
C/C++ Source or Header  |  1977-12-31  |  29KB  |  1,087 lines

  1. /*
  2.      MacWB - a hack providing several well known window controls to the WB
  3.     -----------------------------------------------------------------------
  4.     
  5.     Well, what to say ? I'd like to say THIS:
  6.  
  7.  
  8.                                APFELSINEN »MONTE ROSA«
  9.     
  10.     (Für 2 Personen: 2 große Apfelsinen, 1 Paprikaschote, 1/8l Schlagsahne,
  11.     Zucker, Ingwer, Zitronensaft, Paprika)
  12.  
  13.     Apfelsinen vorsichtig aushöhlen, Schalenrand zackenförmig beschneiden.
  14.     Apfelsinenfleisch in Stückchen schneiden und abwechselnd mit Würfelchen
  15.     der von Kernen und Scheidewänden befreiten Paprikaschote in die Schalen
  16.     füllen. Sahne mit wenig Zucker steif schlagen, mit gemahlenem Ingwer und
  17.     Zitronensaft pikant abschmecken, die Apfelsinen damit garnieren, den Rest
  18.     gesondert reichen. Sahne mit etwas Paprikapulver bepudern.
  19.     
  20.                                                    Ich wünsche Guten Appetit!
  21.     -------------------------------------------------------------------------
  22.  
  23. */
  24.  
  25. //#define DEBUG                       ON
  26. //#define CLOSEWINDOW_SAFELY_NEEDED   YES
  27. //#define CREATE_BACKFILL_HOOK        YES
  28.  
  29. #include <db/defs.h> // == include all + some macros, (ifn,... D(bug()), ...)
  30.  
  31. #define READ_STORE        win->RPort->RP_User
  32. #define WRITE_STORE(xx)    win->RPort->RP_User = xx
  33.  
  34. /* OpenWindowTagList */
  35. #define VEC1 -0x25e
  36. #define LIB1 (struct Library*) IntuitionBase
  37.  
  38. /* CloseWindow */
  39. #define VEC2 -0x48
  40. #define LIB2 (struct Library*) IntuitionBase
  41.  
  42. extern APTR NewVector1;
  43. extern APTR OldVector1;
  44. extern APTR NewVector2;
  45. extern APTR OldVector2;
  46.  
  47. // magic numbers...
  48.  
  49. #define MAGIC_NUMBER 30121971
  50. #define WUD_POINTER 0x80301271
  51. #define GRAY(xx) (xx<<26)|0xFFFFFF,(xx<<26)|0xFFFFFF,(xx<<26)|0xFFFFFF
  52.  
  53. static char *version = "$VER: MacWB 0.2 (19.07.96) ©1996 Daniel Balster";
  54.  
  55. // the BOOPSI classes used in this example; application global.. (not system)
  56.  
  57. Class *cl_macdraggad;
  58. Class *cl_macbordergad;
  59. Class *cl_macborderimg;
  60. Class *cl_maczoomimg;
  61. Class *cl_maccloseimg;
  62. Class *cl_macdragimg;
  63. Class *cl_macsizeimg;
  64.  
  65. // the BOOPSI image packet
  66.  
  67. struct WindowUserData
  68. {
  69.     struct TagItem Tags [4];
  70.     
  71.     ULONG  MagicID;
  72.  
  73.     Object    *Size,    *SizeImg;
  74.     Object    *Dragbar,    *DragImg;
  75.     Object    *Close,    *CloseImg;
  76.     Object    *Zoom,    *ZoomImg;
  77.     Object    *Border,    *BorderImg;
  78.  
  79.     struct Screen *scr;
  80.     struct TextFont *tf;
  81.  
  82. #ifdef CREATE_BACKFILL_HOOK
  83.     struct Hook MacLayerHook;
  84. #endif
  85.     STRPTR *title;
  86.  
  87.     // color pen allocations
  88.  
  89.     BYTE gray00,gray13,gray23,gray29;
  90.     BYTE gray42,gray46,gray55,gray59;
  91.     BYTE gray63,p1,p2,p3;
  92. };
  93.  
  94. struct Image_Data
  95. {
  96.     struct WindowUserData *WUD;
  97. };
  98.  
  99. //////////////////////////////////////////////////////////
  100. //FS GEFALTETES ZEUG HIER !!! ////////////////////////////
  101. /*
  102.     SAVEDS        -> local data a4 register (interrupt/hooks need this)
  103.     ASM            -> tell the compiler to create the register calls;
  104.     REG(x) var    -> put the next variable into register x
  105. */
  106. SAVEDS ASM ULONG DispatchMacDragGad (REG(a0) Class *cl, REG(a2) Object *obj, REG(a1) struct gpRender *msg)
  107. {
  108.     switch (msg->MethodID)
  109.     {
  110.         case GM_LAYOUT            :    /* we only overload LAYOUT and RENDER */
  111.         case GM_RENDER            : 
  112.             if (msg->gpr_GInfo->gi_Window)
  113.             {
  114.                 ULONG width    = (ULONG) msg->gpr_GInfo->gi_Window->Width;
  115.  
  116.                 /* layout ourself (GA_RelWidth!) */
  117.  
  118.                 SetAttrs(obj,
  119.                     GA_Width        , width-2,
  120.                     GA_Height        , 17,
  121.                     TAG_DONE);
  122.                     
  123.                 /* and inherit the values to our image object */
  124.                 
  125.                 SetAttrs(((struct Gadget*)obj)->GadgetRender,
  126.                     IA_Width        , width-2,
  127.                     IA_Height        , 17,
  128.                     IA_Left        , 0,
  129.                     IA_Top        , 0,
  130.                     TAG_DONE);
  131.             }
  132.     }
  133.     
  134.     /* pass *EVERY* method to our superclass ! */
  135.     
  136.     return DoSuperMethodA(cl,obj,msg);
  137. }
  138.  
  139. /*
  140.     the bordergadget is not a real gadget; this will change in
  141.     the next version (all HITTESTS are ignored so far...)
  142. */
  143.  
  144. SAVEDS ASM ULONG DispatchMacBorderGad (REG(a0) Class *cl, REG(a2) Object *obj, REG(a1) struct gpRender *msg)
  145. {
  146.     switch (msg->MethodID)
  147.     {
  148.         case GM_LAYOUT            : 
  149.         case GM_RENDER            : 
  150.             if (msg->gpr_GInfo->gi_Window)
  151.             {
  152.                 ULONG height    = (ULONG) msg->gpr_GInfo->gi_Window->Height;
  153.                 ULONG width    = (ULONG) msg->gpr_GInfo->gi_Window->Width;
  154.     
  155.                 SetAttrs(obj,
  156.                     GA_Width        , width,
  157.                     GA_Height        , height,
  158.                     TAG_DONE);
  159.                 SetAttrs(((struct Gadget*)obj)->GadgetRender,
  160.                     IA_Width        , width,
  161.                     IA_Height        , height,
  162.                     TAG_DONE);
  163.             }
  164.     }
  165.     return DoSuperMethodA(cl,obj,msg);
  166. }
  167.  
  168. /*
  169.     now the image classes.
  170.     
  171.     only NEW and DRAW are overloaded, and all imagery is drawn using
  172.     Move(), Draw() and Rectfill().
  173.     In the next version I'll try to use more efficient and faster rendering
  174.     (polygone structs?) or fixed size images (but they are not scalable).
  175.     
  176.     The new method is just setting the WUD (WindowUserData) for the image.
  177.     Another method would be to put the WUD pointer into the IA_Data attribute.
  178.     (we don't need the ImageData pointer)
  179. */
  180.  
  181. SAVEDS ASM ULONG DispatchMacBorderImg (REG(a0) Class *cl, REG(a2) struct Image *img, REG(a1) struct impDraw* msg)
  182. {
  183.     switch (msg->MethodID)
  184.     {
  185.         case IM_HITTEST        :
  186.             return FALSE;
  187.         case IM_ERASE:
  188.         case IM_DRAW:
  189.         {
  190.             struct RastPort *RP    = msg->imp_RPort;
  191.             struct Image_Data *data = INST_DATA(cl,img);
  192.             UWORD left,top,width,height,X,Y,i,light;
  193.  
  194.             X        = msg->imp_Offset.X;
  195.             Y        = msg->imp_Offset.Y;
  196.             left        = img->LeftEdge + X;
  197.             top        = img->TopEdge + Y;
  198.             width    = img->Width;
  199.             height    = img->Height;
  200.  
  201.             switch (msg->imp_State)
  202.             {
  203.                 case IDS_INACTIVENORMAL:
  204.                     light = data->WUD->gray29;
  205.                     break;
  206.                 case IDS_NORMAL:
  207.                     light = data->WUD->gray00;
  208.                     break;
  209.             }
  210.  
  211.             SetAPen(RP,data->WUD->gray00);
  212.  
  213.             Move (RP,left+width-1,top);
  214.             Draw (RP,left+width-1,top+height-1);
  215.             Draw (RP,left,top+height-1);
  216.             
  217.             SetAPen(RP,light);
  218.             Draw (RP,left,top);
  219.             Draw (RP,left+width-1,top);
  220.  
  221.             Move (RP,left+width-2,top);
  222.             Draw (RP,left+width-2,top+height-2);
  223.             Draw (RP,left,top+height-2);
  224.  
  225.             // draw this only together with the sizer
  226.             if (data->WUD->Size)
  227.             {
  228.                 Move (RP,left+width-2-15,top+19);
  229.                 Draw (RP,left+width-2-15,top+height-16);
  230.                 Draw (RP,left+1,top+height-16);
  231.             }
  232.  
  233.             Move (RP,left+1,top+18);
  234.             Draw (RP,left+width-2,top+18);
  235.  
  236.             return (1);
  237.         }
  238.         break;
  239.  
  240.         case OM_NEW:
  241.         {
  242.             if (img = DoSuperMethodA(cl,img,msg))
  243.             {
  244.                 struct Image_Data *data = INST_DATA(cl,img);
  245.             
  246.                 data->WUD = GetTagData(WUD_POINTER,0,((struct opSet*)msg)->ops_AttrList);
  247.             
  248.                 return (ULONG)(img);
  249.             }
  250.             CoerceMethod(cl,img,OM_DISPOSE);
  251.             return NULL;
  252.         }
  253.         break;
  254.     }
  255.     DoSuperMethodA(cl,img,msg);
  256. }
  257.  
  258. SAVEDS ASM ULONG DispatchMacDragImg (REG(a0) Class *cl, REG(a2) struct Image *img, REG(a1) struct impDraw* msg)
  259. {
  260.     switch (msg->MethodID)
  261.     {
  262.         case IM_DRAW:
  263.         {
  264.             struct RastPort *RP = msg->imp_RPort;
  265.             struct Image_Data *data = INST_DATA(cl,img);
  266.             UWORD left,top,width,height,X,Y,i,p1,p2;
  267.  
  268.             X        = msg->imp_Offset.X;
  269.             Y        = msg->imp_Offset.Y;
  270.             left        = img->LeftEdge + X;
  271.             top        = img->TopEdge + Y;
  272.             width    = img->Width - 1;
  273.             height    = img->Height;
  274.  
  275.             switch (msg->imp_State)
  276.             {
  277.                 case IDS_INACTIVENORMAL:
  278.                     SetAPen(RP,data->WUD->gray59); // 63 !!
  279.                     RectFill(RP,left,top,left+width-1,top+height-1);
  280.                     p1 = data->WUD->gray29; // 34 !!
  281.                     p2 = data->WUD->gray59; // 63 !!
  282.  
  283.                     // the next drawing is only to fix a bug ??
  284.  
  285.                     SetAPen(RP,data->WUD->gray29);
  286.                     Move (RP,left+width,top);
  287.                     Draw (RP,left+width,top+height-1);
  288.                     break;
  289.                 case IDS_NORMAL:
  290.                     SetAPen(RP,data->WUD->gray55);
  291.                     Move (RP,left,top+height-2);
  292.                     Draw (RP,left,top);
  293.                     Draw (RP,left+width-2,top);
  294.  
  295.                     SetAPen(RP,data->WUD->gray46);
  296.                     Move (RP,left+width-1,top);                
  297.                     Draw (RP,left+width-1,top+height-1);
  298.                     Draw (RP,left,top+height-1);
  299.  
  300.                     SetAPen(RP,data->WUD->gray59);
  301.                     RectFill(RP,left+1,top+1,left+width-2,top+height-2);
  302.  
  303.                     SetAPen(RP,data->WUD->gray29);
  304.                     for (i=top+3;i<=top+13;i+=2)
  305.                     {
  306.                         Move (RP,left+1,i);
  307.                     Draw (RP,left+width-2,i);
  308.                     }
  309.                     p1 = data->WUD->gray00;
  310.                     p2 = data->WUD->gray59;
  311.  
  312.                     // the next drawing is only to fix a bug ??
  313.  
  314.                     SetAPen(RP,data->WUD->gray00);
  315.                     Move (RP,left+width,top);
  316.                     Draw (RP,left+width,top+height-1);
  317.                     break;
  318.             }
  319.  
  320.     /*
  321.         draw the centered title:
  322.         
  323.         - check how many chars are fitting into the title area (==chars)
  324.         - draw 'chars'-number of chars into the title
  325.     */
  326.  
  327.             {
  328.                 struct TextExtent te;
  329.                 char *text = *(data->WUD->title);
  330.                 int len = strlen(text);
  331.                 int chars, pixel;
  332.                 
  333.                 SetABPenDrMd(RP,p1,p2,JAM2);
  334.                 SetFont (RP,data->WUD->tf);
  335.                 SetSoftStyle(RP,FS_NORMAL,FS_NORMAL);
  336.  
  337.                 // absolute! *change*!....
  338.                 // 42 == 10+11 ... 11+10   (close and zoom gadget)
  339.  
  340.                 chars = TextFit(RP,text,len,&te,0,1,width-42,1000);
  341.                 pixel = TextLength(RP,text,chars);
  342.  
  343.                 Move (RP,left+((width>>1)-(pixel>>1)),top+4+RP->TxBaseline-1);
  344.                 Text (RP,text,chars);
  345.             }
  346.  
  347.             return (1);
  348.         }
  349.     
  350.         case OM_NEW:
  351.         {
  352.             if (img = DoSuperMethodA(cl,img,msg))
  353.             {
  354.                 struct Image_Data *data = INST_DATA(cl,img);
  355.             
  356.                 data->WUD = GetTagData(WUD_POINTER,0,((struct opSet*)msg)->ops_AttrList);
  357.             
  358.                 return (ULONG)(img);
  359.             }
  360.             CoerceMethod(cl,img,OM_DISPOSE);
  361.             return NULL;
  362.         }
  363.  
  364.     }
  365.  
  366.     DoSuperMethodA(cl,img,msg);
  367. }
  368.  
  369. SAVEDS ASM ULONG DispatchMacSizeImg (REG(a0) Class *cl, REG(a2) struct Image *img, REG(a1) struct impDraw* msg)
  370. {
  371.     if (msg->MethodID == IM_DRAW)
  372.     {
  373.         struct RastPort *RP    = msg->imp_RPort;
  374.         struct Image_Data *data = INST_DATA(cl,img);
  375.         UWORD left,top,width,height,X,Y,i;
  376.  
  377.         X        = msg->imp_Offset.X;
  378.         Y        = msg->imp_Offset.Y;
  379.         left        = img->LeftEdge + X;
  380.         top        = img->TopEdge + Y;
  381.         width    = img->Width;
  382.         height    = img->Height;
  383.  
  384.         switch (msg->imp_State)
  385.         {
  386.             case IDS_INACTIVENORMAL:
  387.                 SetAPen(RP,data->WUD->gray29);
  388.                 Move (RP,left,top+height-1);
  389.                 Draw (RP,left,top);
  390.                 Draw (RP,left+width-1,top);
  391.                 SetAPen(RP,data->WUD->gray59);
  392.                 RectFill (RP,left+1,top+1,left+width-1,top+height-1);
  393.                 break;
  394.             case IDS_NORMAL:
  395.             
  396.             /* POLYGONES OR INLINE IMAGES SHOULD BE USED HERE !!! */
  397.             
  398.                 SetAPen(RP,data->WUD->gray00);
  399.                 Move (RP,left,top+height-1);    Draw (RP,left,top);    Draw (RP,left+width-1,top);
  400.                 SetAPen(RP,data->WUD->gray55);
  401.                 RectFill (RP,left+1,top+1,left+width-1,top+height-1);
  402.                 SetAPen(RP,data->WUD->gray42);
  403.                 RectFill (RP,left+5,top+5,left+width-4,top+height-4);
  404.                 SetAPen(RP,data->WUD->gray13);
  405.                 Move (RP,left+3,top+8);    Draw (RP,left+3,top+3);    Draw (RP,left+8,top+3);
  406.                 Move (RP,left+5,top+8);    Draw (RP,left+8,top+8);    Draw (RP,left+8,top+5);
  407.                 Move (RP,left+4,top+9);    Draw (RP,left+4,top+width-3);
  408.                 Move (RP,left+9,top+4);    Draw (RP,left+width-3,top+4);
  409.                 Move (RP,left+6,top+height-3);    Draw (RP,left+width-3,top+height-3);    Draw (RP,left+width-3,top+6);
  410.                 SetAPen(RP,data->WUD->gray55);
  411.                 Move (RP,left+4,top+8);    Draw (RP,left+4,top+4);    Draw (RP,left+8,top+4);
  412.                 Move (RP,left+5,top+9);    Draw (RP,left+5,top+width-3);
  413.                 Move (RP,left+9,top+5);    Draw (RP,left+width-3,top+5);
  414.                 break;
  415.         }
  416.  
  417.         return (1);
  418.     }
  419.  
  420.     if (msg->MethodID==OM_NEW)
  421.     {
  422.         if (img = DoSuperMethodA(cl,img,msg))
  423.         {
  424.             struct Image_Data *data = INST_DATA(cl,img);
  425.         
  426.             data->WUD = GetTagData(WUD_POINTER,0,((struct opSet*)msg)->ops_AttrList);
  427.         
  428.             return (ULONG)(img);
  429.         }
  430.         CoerceMethod(cl,img,OM_DISPOSE);
  431.         return NULL;
  432.     }
  433.  
  434.     DoSuperMethodA(cl,img,msg);
  435. }
  436.  
  437. SAVEDS ASM ULONG DispatchMacZoomImg (REG(a0) Class *cl, REG(a2) struct Image *img, REG(a1) struct impDraw* msg)
  438. {
  439.     if (msg->MethodID == IM_DRAW)
  440.     {
  441.         struct RastPort *RP    = msg->imp_RPort;
  442.         struct Image_Data *data = INST_DATA(cl,img);
  443.         UWORD left,top,width,height,w2,h2,X,Y,i;
  444.  
  445.         X        = msg->imp_Offset.X;
  446.         Y        = msg->imp_Offset.Y;
  447.         left        = img->LeftEdge + X;
  448.         top        = img->TopEdge + Y;
  449.         width    = img->Width;
  450.         height    = img->Height;
  451.  
  452.         switch (msg->imp_State)
  453.         {
  454.             case IDS_INACTIVENORMAL:
  455.                 break;
  456.             case IDS_NORMAL:
  457.                 SetAPen(RP,data->WUD->gray59);
  458.                 Move (RP,left,top);    Draw (RP,left,top+width-3);
  459.                 Move (RP,left+width-1,top);    Draw (RP,left+width-1,top+width-3);
  460.                 SetAPen(RP,data->WUD->gray13);
  461.                 Move (RP,left+1,top+height-1);    Draw (RP,left+1,top);    Draw (RP,left+width-2,top);
  462.                 SetAPen(RP,data->WUD->gray55);
  463.                 Move (RP,left+2,top+1);Draw (RP,left+width-2,top+1);    Draw (RP,left+width-2,top+height-1);    Draw (RP,left+2,top+height-1);    Draw (RP,left+2,top+1);
  464.                 SetAPen(RP,data->WUD->gray42);
  465.                 RectFill (RP,left+3,top+2,left+width-4,top+height-3);
  466.                 w2 = (width-4) >> 1;
  467.                 h2 = (height-3) >> 1;
  468.                 SetAPen(RP,data->WUD->gray13);
  469.                 Move (RP,left+3,top+height-2);    Draw (RP,left+width-3,top+height-2);    Draw (RP,left+width-3,top+2);
  470.                 Move (RP,left+3,top+2+h2);    Draw (RP,left+3+w2,top+2+h2);    Draw (RP,left+3+w2,top+2);
  471.                 break;
  472.             case IDS_SELECTED:
  473.                 SetAPen(RP,data->WUD->gray59);
  474.                 Move (RP,left,top);    Draw (RP,left,top+width-3);
  475.                 Move (RP,left+width-1,top);    Draw (RP,left+width-1,top+width-3);
  476.                 SetAPen(RP,data->WUD->gray29);
  477.                 RectFill (RP,left+2,top+1,left+width-3,top+height-2);
  478.                 SetAPen(RP,data->WUD->gray00);
  479.                 Move (RP,left+1,top);
  480.                 Draw (RP,left+width-2,top);
  481.                 Draw (RP,left+width-2,top+height-1);
  482.                 Draw (RP,left+1,top+height-1);
  483.                 Draw (RP,left+1,top);
  484.                 X = width>>1; Y = height>>1;
  485.                 Move (RP,left+2,top+Y);
  486.                 Draw (RP,left+width-2,top+Y);
  487.                 Move (RP,left+X,top+1);
  488.                 Draw (RP,left+X,top+height-2);
  489.                 Move (RP,left+3,top+2);
  490.                 Draw (RP,left+width-4,top+height-3);
  491.                 Move (RP,left+3,top+height-3);
  492.                 Draw (RP,left+width-4,top+2);
  493.                 SetAPen(RP,data->WUD->gray29);
  494.                 RectFill (RP,left+X-1,top+Y-1,left+X+1,top+Y+1);
  495.         }
  496.  
  497.         return (1);
  498.     }
  499.  
  500.     if (msg->MethodID==OM_NEW)
  501.     {
  502.         if (img = DoSuperMethodA(cl,img,msg))
  503.         {
  504.             struct Image_Data *data = INST_DATA(cl,img);
  505.         
  506.             data->WUD = GetTagData(WUD_POINTER,0,((struct opSet*)msg)->ops_AttrList);
  507.         
  508.             return (ULONG)(img);
  509.         }
  510.         CoerceMethod(cl,img,OM_DISPOSE);
  511.         return NULL;
  512.     }
  513.  
  514.     DoSuperMethodA(cl,img,msg);
  515. }
  516.  
  517. SAVEDS ASM ULONG DispatchMacCloseImg (REG(a0) Class *cl, REG(a2) struct Image *img, REG(a1) struct impDraw* msg)
  518. {
  519.     if (msg->MethodID == IM_DRAW)
  520.     {
  521.         struct RastPort *RP    = msg->imp_RPort;
  522.         struct Image_Data *data = INST_DATA(cl,img);
  523.         UWORD left,top,width,height,X,Y,i;
  524.  
  525.         X        = msg->imp_Offset.X;
  526.         Y        = msg->imp_Offset.Y;
  527.         left        = img->LeftEdge + X;
  528.         top        = img->TopEdge + Y;
  529.         width    = img->Width;
  530.         height    = img->Height;
  531.  
  532.         switch (msg->imp_State)
  533.         {
  534.             case IDS_INACTIVENORMAL:
  535.                 break;
  536.             case IDS_NORMAL:
  537.                 SetAPen(RP,data->WUD->gray59);
  538.                 Move (RP,left,top);    Draw (RP,left,top+width-3);
  539.                 Move (RP,left+width-1,top);    Draw (RP,left+width-1,top+width-3);
  540.                 SetAPen(RP,data->WUD->gray13);
  541.                 Move (RP,left+1,top+height-1);    Draw (RP,left+1,top);    Draw (RP,left+width-2,top);
  542.                 SetAPen(RP,data->WUD->gray55);
  543.                 Move (RP,left+2,top+1);    Draw (RP,left+width-2,top+1);    Draw (RP,left+width-2,top+height-1);    Draw (RP,left+2,top+height-1);    Draw (RP,left+2,top+1);
  544.                 SetAPen(RP,data->WUD->gray13);
  545.                 Move (RP,left+3,top+height-2);    Draw (RP,left+width-3,top+height-2);    Draw (RP,left+width-3,top+2);
  546.                 SetAPen(RP,data->WUD->gray42);
  547.                 RectFill (RP,left+3,top+2,left+width-4,top+height-3);
  548.                 break;
  549.             case IDS_SELECTED:
  550.                 SetAPen(RP,data->WUD->gray59);
  551.                 Move (RP,left,top);    Draw (RP,left,top+width-3);
  552.                 Move (RP,left+width-1,top);    Draw (RP,left+width-1,top+width-3);
  553.                 SetAPen(RP,data->WUD->gray29);
  554.                 RectFill (RP,left+2,top+1,left+width-3,top+height-2);
  555.                 SetAPen(RP,data->WUD->gray00);
  556.                 Move (RP,left+1,top);
  557.                 Draw (RP,left+width-2,top);
  558.                 Draw (RP,left+width-2,top+height-1);
  559.                 Draw (RP,left+1,top+height-1);
  560.                 Draw (RP,left+1,top);
  561.                 /* draw the centered "star" */
  562.                 X = width>>1; Y = height>>1;
  563.                 Move (RP,left+2,top+Y);
  564.                 Draw (RP,left+width-2,top+Y);
  565.                 Move (RP,left+X,top+1);
  566.                 Draw (RP,left+X,top+height-2);
  567.                 Move (RP,left+3,top+2);
  568.                 Draw (RP,left+width-4,top+height-3);
  569.                 Move (RP,left+3,top+height-3);
  570.                 Draw (RP,left+width-4,top+2);
  571.                 SetAPen(RP,data->WUD->gray29);
  572.                 RectFill (RP,left+X-1,top+Y-1,left+X+1,top+Y+1);
  573.  
  574.                 break;
  575.         }
  576.  
  577.         return (1);
  578.     }
  579.  
  580.     if (msg->MethodID==OM_NEW)
  581.     {
  582.         if (img = DoSuperMethodA(cl,img,msg))
  583.         {
  584.             struct Image_Data *data = INST_DATA(cl,img);
  585.         
  586.             data->WUD = GetTagData(WUD_POINTER,0,((struct opSet*)msg)->ops_AttrList);
  587.         
  588.             return (ULONG)(img);
  589.         }
  590.         CoerceMethod(cl,img,OM_DISPOSE);
  591.         return NULL;
  592.     }
  593.  
  594.     DoSuperMethodA(cl,img,msg);
  595. }
  596.  
  597. /********************************************************/
  598. /*** init/kill the custom classes ***********************/
  599. /********************************************************/
  600.  
  601. int init (void)
  602. {
  603.     /* (layouted) gadgets ... */
  604.     if (cl_macdraggad    = MakeClass (NULL,"buttongclass",0,0,0))                    cl_macdraggad->cl_Dispatcher.h_Entry    = DispatchMacDragGad;
  605.     if (cl_macbordergad    = MakeClass (NULL,"buttongclass",0,0,0))                    cl_macbordergad->cl_Dispatcher.h_Entry    = DispatchMacBorderGad;
  606.  
  607.     /* images ... */
  608.     if (cl_macdragimg    = MakeClass (NULL,"imageclass",0,sizeof(struct Image_Data),0))    cl_macdragimg->cl_Dispatcher.h_Entry    = DispatchMacDragImg;
  609.     if (cl_macsizeimg    = MakeClass (NULL,"imageclass",0,sizeof(struct Image_Data),0))    cl_macsizeimg->cl_Dispatcher.h_Entry    = DispatchMacSizeImg;
  610.     if (cl_maczoomimg    = MakeClass (NULL,"imageclass",0,sizeof(struct Image_Data),0))    cl_maczoomimg->cl_Dispatcher.h_Entry    = DispatchMacZoomImg;
  611.     if (cl_maccloseimg    = MakeClass (NULL,"imageclass",0,sizeof(struct Image_Data),0))    cl_maccloseimg->cl_Dispatcher.h_Entry    = DispatchMacCloseImg;
  612.     if (cl_macborderimg    = MakeClass (NULL,"imageclass",0,sizeof(struct Image_Data),0))    cl_macborderimg->cl_Dispatcher.h_Entry    = DispatchMacBorderImg;
  613.  
  614.     return (int)
  615.         cl_macdraggad &&
  616.         cl_macbordergad &&
  617.         cl_macdragimg &&
  618.         cl_macsizeimg &&
  619.         cl_maczoomimg &&
  620.         cl_maccloseimg &&
  621.         cl_macborderimg;
  622. }
  623.  
  624. void kill (void)
  625. {
  626.     /* (layouted) gadgets ... */
  627.     FreeClass (cl_macdraggad);
  628.     FreeClass (cl_macbordergad);
  629.  
  630.     /* images ... */
  631.     FreeClass (cl_macdragimg);
  632.     FreeClass (cl_macsizeimg);
  633.     FreeClass (cl_maczoomimg);
  634.     FreeClass (cl_maccloseimg);
  635.     FreeClass (cl_macborderimg);
  636. }
  637.  
  638. /******************************************************/
  639.  
  640. #ifdef CREATE_BACKFILL_HOOK
  641.  
  642. // an easy "faked-bitmap" backfill hook (for the "gray" background)
  643.  
  644. struct bfMsg
  645. {
  646.     struct Layer *Layer;
  647.     struct Rectangle Bounds;
  648.     LONG OffsetX;
  649.     LONG OffsetY;
  650. };
  651.  
  652. #define RECTSIZEX(r) ((r)->MaxX-(r)->MinX+1)
  653. #define RECTSIZEY(r) ((r)->MaxY-(r)->MinY+1)
  654.  
  655. struct BitMap White = { 256, 256, 0,8, 0, { 0 } };
  656.  
  657. STATIC ULONG SAVEDS ASM MacLayerFunc (REG(a0) struct Hook *Hook,REG(a2) struct RastPort *RP,REG(a1) struct bfMsg *BFM)
  658. {
  659.     struct RastPort myRP = *RP;
  660.     myRP.Layer = NULL;
  661.  
  662.     BltBitMap(&White,BFM->Bounds.MinX,BFM->Bounds.MinY,RP->BitMap,BFM->Bounds.MinX,BFM->Bounds.MinY,RECTSIZEX(&BFM->Bounds),RECTSIZEY(&BFM->Bounds),0xC0,0xFF,NULL);
  663.  
  664.     return 0;
  665. }
  666.  
  667. #endif
  668.  
  669. /******************************************************/
  670.  
  671. // some typical mac fonts
  672.  
  673. struct TextAttr MacFont =
  674. {
  675.     "chicago.font",13,FPF_DISKFONT,FS_NORMAL
  676. };
  677. struct TextAttr MacFont2 =
  678. {
  679.     "monaco.font",9,FPF_DISKFONT,FS_NORMAL
  680. };
  681. //FE
  682. //////////////////////////////////////////////////////////
  683.  
  684. //// P·R·O·T·O·T·Y·P·E·S
  685.  
  686. SAVEDS struct TagItem ASM *Before_OpenWindow (REG(a0) struct NewWindow *nw, REG(a1) struct TagItem *ti)
  687. {
  688.     struct Process *pr = (struct Process*) FindTask(0);
  689.     STRPTR tname = pr->pr_Task.tc_Node.ln_Name;
  690.  
  691.     ifn (strcmp(tname,"Workbench")) goto found;
  692.     ifn (strcmp(tname,"ShapeShifter")) goto found;    /* this is a *must* :-) */
  693.  
  694.     return ti;
  695.  
  696. found:
  697.     {
  698.         struct WindowUserData *WUD;
  699.  
  700.         // warning! we shouldn't patch any workbench backdrop window
  701.         
  702.         if (nw) if (nw->Flags & WFLG_BORDERLESS) return ti;
  703.  
  704.         ifn (WUD = AllocMem(sizeof(*WUD),MEMF_CLEAR|MEMF_PUBLIC)) return ti;
  705.  
  706.         WUD->tf = OpenDiskFont(&MacFont);
  707.  
  708.         if (WUD->tf)
  709.         {
  710.             register int i;
  711.             struct TagItem *tags;
  712.  
  713.             if (WUD->scr = LockPubScreen ("Workbench"))
  714.             {
  715.                 struct ColorMap *cm = WUD->scr->ViewPort.ColorMap;
  716.  
  717.                 WUD->gray00 = ObtainBestPen (cm,GRAY(0) ,OBP_Precision,PRECISION_EXACT,TAG_END);
  718.                 WUD->gray13 = ObtainBestPen (cm,GRAY(13),OBP_Precision,PRECISION_EXACT,TAG_END);
  719.                 WUD->gray23 = ObtainBestPen (cm,GRAY(23),OBP_Precision,PRECISION_EXACT,TAG_END);
  720.                 WUD->gray29 = ObtainBestPen (cm,GRAY(29),OBP_Precision,PRECISION_EXACT,TAG_END);
  721.                 WUD->gray42 = ObtainBestPen (cm,GRAY(42),OBP_Precision,PRECISION_EXACT,TAG_END);
  722.                 WUD->gray46 = ObtainBestPen (cm,GRAY(46),OBP_Precision,PRECISION_EXACT,TAG_END);
  723.                 WUD->gray55 = ObtainBestPen (cm,GRAY(55),OBP_Precision,PRECISION_EXACT,TAG_END);
  724.                 WUD->gray59 = ObtainBestPen (cm,GRAY(59),OBP_Precision,PRECISION_EXACT,TAG_END);
  725.                 WUD->gray63 = ObtainBestPen (cm,GRAY(63),OBP_Precision,PRECISION_EXACT,TAG_END);
  726.                 UnlockPubScreen(0,WUD->scr);
  727.             }
  728.  
  729. #ifdef CREATE_BACKFILL_HOOK
  730.                 // Create a "white-fixed-color" bitmap
  731.                 for (i=0;i<8;i++) White.Planes[i] = (PLANEPTR) ((((ULONG)WUD->gray55) & (1L<<i)) == (1L<<i)) ? (-1) : (0);
  732.                 WUD->MacLayerHook.h_Entry = (VOID*) MacLayerFunc;
  733. #endif
  734.  
  735.                 WUD->BorderImg = NewObject(cl_macborderimg,0,
  736.                     WUD_POINTER    , WUD,
  737.                     GA_Top        , 0,
  738.                     GA_Left        , 0,
  739.                     TAG_DONE);
  740.                 ifn (WUD->BorderImg) goto OpenWindoid_failed;
  741.  
  742.                 WUD->CloseImg = NewObject(cl_maccloseimg,0,
  743.                     IA_Width        , 13,
  744.                     IA_Height        , 11,
  745.                     WUD_POINTER    , WUD,
  746.                     TAG_DONE);
  747.                 ifn (WUD->CloseImg) goto OpenWindoid_failed;
  748.  
  749.                 WUD->ZoomImg = NewObject(cl_maczoomimg,0,
  750.                     IA_Width        , 13,
  751.                     IA_Height        , 11,
  752.                     WUD_POINTER    , WUD,
  753.                     TAG_DONE);
  754.                 ifn (WUD->ZoomImg) goto OpenWindoid_failed;
  755.  
  756.                 if (nw) if (nw->Flags & WFLG_SIZEGADGET)
  757.                 {
  758.                 WUD->SizeImg = NewObject(cl_macsizeimg,0,
  759.                     IA_Width        , 15,
  760.                     IA_Height        , 15,
  761.                     WUD_POINTER    , WUD,
  762.                     TAG_DONE);
  763.                 ifn (WUD->SizeImg) goto OpenWindoid_failed;
  764.                 }
  765.  
  766.                 WUD->DragImg = NewObject(cl_macdragimg,0,
  767.                     IA_Height        , 17,
  768.                     IA_Width        , 0,
  769.                     WUD_POINTER    , WUD,
  770.                     TAG_DONE);
  771.                 ifn (WUD->DragImg) goto OpenWindoid_failed;
  772.  
  773.                 WUD->Border = NewObject(cl_macbordergad,0,
  774.                     GA_RelWidth    , TRUE,
  775.                     GA_RelHeight    , TRUE,
  776.                     GA_Top        , 0,
  777.                     GA_Left        , 0,
  778.                     GA_ID        , MAGIC_NUMBER,
  779.                     GA_Image        , WUD->BorderImg,
  780.                     GA_BottomBorder, TRUE,
  781.                     GA_RightBorder    , TRUE,
  782.                     TAG_DONE);
  783.                 ifn (WUD->Border) goto OpenWindoid_failed;
  784.  
  785.                 WUD->Dragbar = NewObject(cl_macdraggad,NULL,
  786.                     GA_Top        , 1,
  787.                     GA_Left        , 1,
  788.                     GA_RelWidth    , TRUE,
  789.                     GA_Width        , 0,
  790.                     GA_Height        , 17,
  791.                     GA_SysGType    , GTYP_WDRAGGING,
  792.                     GA_TopBorder    , TRUE,
  793.                     GA_Image        , WUD->DragImg,
  794.                     GA_ID        , MAGIC_NUMBER,
  795.                     TAG_DONE);
  796.                 ifn (WUD->Dragbar) goto OpenWindoid_failed;
  797.  
  798.                 WUD->Close = NewObject(NULL,"buttongclass",
  799.                     GA_Top        , 4,
  800.                     GA_Left        , 8,
  801.                     GA_Width        , 13,
  802.                     GA_Height        , 11,
  803.                     GA_RelVerify    , TRUE,
  804.                     GA_EndGadget    , TRUE,
  805.                     GA_SysGType    , GTYP_CLOSE,
  806.                     GA_TopBorder    , TRUE,
  807.                     GA_Image        , WUD->CloseImg,
  808.                     GA_ID        , MAGIC_NUMBER,
  809.                     TAG_DONE);
  810.                 ifn (WUD->Close) goto OpenWindoid_failed;
  811.  
  812.                 WUD->Zoom = NewObject(NULL,"buttongclass",
  813.                     GA_Top        , 4,
  814.                     GA_RelRight    , -(11+10),
  815.                     GA_Width        , 13,
  816.                     GA_Height        , 11,
  817.                     GA_RelVerify    , TRUE,
  818.                     GA_SysGType    , GTYP_WZOOM,
  819.                     GA_TopBorder    , TRUE,
  820.                     GA_Image        , WUD->ZoomImg,
  821.                     GA_ID        , MAGIC_NUMBER,
  822.                     TAG_DONE);
  823.                 ifn (WUD->Zoom) goto OpenWindoid_failed;
  824.  
  825.                 if (nw) if (nw->Flags & WFLG_SIZEGADGET)
  826.                 {
  827.                 WUD->Size = NewObject(NULL,"buttongclass",
  828.                     GA_RelBottom    , -16,
  829.                     GA_RelRight    , -16,
  830.                     GA_Width        , 15,
  831.                     GA_Height        , 15,
  832.                     GA_RelVerify    , TRUE,
  833.                     GA_SysGType    , GTYP_SIZING,
  834.                     GA_Image        , WUD->SizeImg,
  835.                     GA_ID        , MAGIC_NUMBER,
  836.                     TAG_DONE);
  837.                 ifn (WUD->Size) goto OpenWindoid_failed;
  838.                 }
  839.  
  840.                 for (tags=ti;tags->ti_Tag;tags++)
  841.                 {
  842.                     switch (tags->ti_Tag)
  843.                     {
  844.                         case WA_DragBar:
  845.                         case WA_DepthGadget:
  846.                         case WA_CloseGadget:
  847.                         case WA_Zoom:
  848.                         case WA_SizeGadget:
  849.                             tags->ti_Tag  = TAG_IGNORE;
  850.                             tags->ti_Data = FALSE;
  851.                             break;
  852.                         case WA_Gadgets:
  853.                             {
  854.                                 struct Gadget *gg;
  855.                                 if (gg = tags->ti_Data)
  856.                                 {
  857.                                     while (gg->NextGadget)
  858.                                     {
  859.                                         if (gg->GadgetType == GTYP_PROPGADGET)
  860.                                         {
  861.                                             if (gg->Activation & GACT_RIGHTBORDER)
  862.                                             {
  863.                                                 gg->Height  -= 22;
  864.                                                 gg->TopEdge = 22;
  865.                                             }
  866.                                         }
  867.                                         gg = gg->NextGadget;
  868.                                     }
  869.                                 }
  870.                             }
  871.                             break;
  872.                         case WA_Flags:
  873.                             tags->ti_Data &=~ (WFLG_CLOSEGADGET|WFLG_DEPTHGADGET|WFLG_DRAGBAR|WFLG_SIZEGADGET);
  874.                             tags->ti_Data |=  (WFLG_BORDERLESS);
  875.                             break;
  876.                     }
  877.                 }
  878.  
  879.                 WUD->MagicID = MAGIC_NUMBER;
  880.  
  881.                 WUD->Tags[0].ti_Tag        = WA_Borderless;
  882.                 WUD->Tags[0].ti_Data    = TRUE;
  883. #ifdef CREATE_BACKFILL_HOOK
  884.                 WUD->Tags[1].ti_Tag        = WA_BackFill;
  885.                 WUD->Tags[1].ti_Data    = &(WUD->MacLayerHook);
  886.                 WUD->Tags[2].ti_Tag        = TAG_MORE;
  887.                 WUD->Tags[2].ti_Data    = ti;
  888. #else
  889.                 WUD->Tags[1].ti_Tag        = TAG_MORE;
  890.                 WUD->Tags[1].ti_Data    = ti;
  891. #endif
  892.                 if (nw)
  893.                 {
  894.                     struct Gadget *gg;
  895.                     if (gg = nw->FirstGadget)
  896.                     {
  897.                         while (gg) //HIT
  898.                         {
  899.                             if (gg->GadgetType == GTYP_PROPGADGET)
  900.                             {
  901.                                 if (gg->Activation & GACT_RIGHTBORDER)
  902.                                 {
  903.                                     gg->Height     += (-8 + 22);
  904.                                     gg->TopEdge    = 19;
  905.                                     gg->LeftEdge    -= 2;
  906.                                     gg->Width        += 4;
  907.                                 //    ((struct PropInfo*)gg->SpecialInfo)->Flags &=~ PROPNEWLOOK;
  908.                                     //gg->Activation &=~ GACT_RELVERIFY;
  909.                                     //gg->Activation |= (GACT_IMMEDIATE | GACT_FOLLOWMOUSE);
  910.                                 }
  911.                                 if (gg->Activation & GACT_BOTTOMBORDER)
  912.                                 {
  913.                                     gg->Height    += 7;
  914.                                     gg->TopEdge    -= 7;
  915.                                     gg->Width        += 37;
  916.                                     gg->LeftEdge    -= 2;
  917.                                 //    ((struct PropInfo*)gg->SpecialInfo)->Flags &=~ PROPNEWLOOK;
  918.                                     //gg->Activation &=~ GACT_RELVERIFY;
  919.                                     //gg->Activation |= (GACT_IMMEDIATE | GACT_FOLLOWMOUSE);
  920.                                 }
  921.                             }
  922.                             if (gg->NextGadget->GadgetType != GTYP_PROPGADGET)
  923.                             {
  924.                                 gg->NextGadget = NULL;
  925.                             }
  926.                             gg = gg->NextGadget;
  927.                         }
  928.                     }
  929.                     nw->Flags &= ~(WFLG_CLOSEGADGET|WFLG_DEPTHGADGET|WFLG_DRAGBAR|WFLG_SIZEGADGET);
  930.                 }
  931.  
  932.                 return (struct TagItem*) (((int)WUD) | 1);
  933.  
  934.             /* never reached */
  935.  
  936.     OpenWindoid_failed:
  937.  
  938.             DisposeObject (WUD->Border);
  939.             DisposeObject (WUD->BorderImg);
  940.             DisposeObject (WUD->Size);
  941.             DisposeObject (WUD->SizeImg);
  942.             DisposeObject (WUD->Zoom);
  943.             DisposeObject (WUD->ZoomImg);
  944.             DisposeObject (WUD->Dragbar);
  945.             DisposeObject (WUD->DragImg);
  946.             DisposeObject (WUD->Close);
  947.             DisposeObject (WUD->CloseImg);
  948.         }
  949.         FreeMem (WUD,sizeof(*WUD));
  950.     }
  951.     return ti;
  952. }
  953.  
  954. SAVEDS VOID ASM After_OpenWindow (REG(a0) struct Window *win, REG(a1) struct WindowUserData *WUD)
  955. {
  956.     if (WUD) if (WUD->MagicID == MAGIC_NUMBER)
  957.     {
  958.         WRITE_STORE(WUD);
  959.  
  960.         WUD->title = &(win->Title);
  961.  
  962. #ifdef CREATE_BACKFILL_HOOK
  963.         SetBPen(win->RPort,WUD->gray55);
  964.         SetAPen(win->RPort,WUD->gray00);    /* black */
  965.         SetDrMd(win->RPort,JAM2);
  966. #endif
  967.  
  968.         AddGadget(win,WUD->Close,(UWORD)-1);
  969.         AddGadget(win,WUD->Zoom,(UWORD)-1);
  970.         if (WUD->Size) AddGadget(win,WUD->Size,(UWORD)-1);
  971.         AddGadget(win,WUD->Dragbar,(UWORD)-1);
  972.         AddGadget(win,WUD->Border,(UWORD)-1);
  973.  
  974.         win->BorderLeft    = 1;
  975.         win->BorderTop        = 19;
  976.         win->BorderRight    += 1;
  977.         win->BorderBottom    += 1;
  978.  
  979.         RefreshWindowFrame(win);        /* re-calculate the border */
  980.     }
  981. }
  982.  
  983.  
  984. SAVEDS struct WindowUserData* ASM Before_CloseWindow (REG(a0) struct Window *win)
  985. {
  986.     if (READ_STORE)
  987.     {
  988.         if (((struct WindowUserData*)READ_STORE)->MagicID == MAGIC_NUMBER)
  989.         {
  990.             struct WindowUserData *WUD = READ_STORE;
  991.             WRITE_STORE(NULL);
  992.  
  993. #ifdef CLOSEWINDOW_SAFELY_NEEDED
  994.         {
  995.             struct IntuiMessage *imsg;
  996.             struct Node *succ;
  997.  
  998.             /* taken from the RKM examples */
  999.  
  1000.             Forbid();
  1001.             imsg = (struct IntuiMessage*) win->UserPort->mp_MsgList.lh_Head;
  1002.             while (succ = imsg->ExecMessage.mn_Node.ln_Succ)
  1003.             {
  1004.                 if (imsg->IDCMPWindow == win)
  1005.                 {
  1006.                     Remove ((struct Message*)imsg);
  1007.                     ReplyMsg ((struct Message*)imsg);
  1008.                 }
  1009.                 imsg = (struct IntuiMessage *) succ;
  1010.             }
  1011.             ModifyIDCMP(win,0);
  1012.             Permit();
  1013.         }
  1014. #endif
  1015.             return WUD;
  1016.         }
  1017.     }
  1018.  
  1019.     return 0;
  1020. }
  1021.  
  1022. VOID ASM SAVEDS After_CloseWindow (REG(a1) struct WindowUserData *WUD)
  1023. {
  1024.     if (WUD) if (WUD->MagicID == MAGIC_NUMBER)
  1025.     {
  1026.         D(bug("Magic Number found\n"));
  1027.  
  1028.         DisposeObject (WUD->Border);
  1029.         DisposeObject (WUD->BorderImg);
  1030.         DisposeObject (WUD->Size);
  1031.         DisposeObject (WUD->SizeImg);
  1032.         DisposeObject (WUD->Zoom);
  1033.         DisposeObject (WUD->ZoomImg);
  1034.         DisposeObject (WUD->Dragbar);
  1035.         DisposeObject (WUD->DragImg);
  1036.         DisposeObject (WUD->Close);
  1037.         DisposeObject (WUD->CloseImg);
  1038.  
  1039.         if (WUD->scr)
  1040.         {
  1041.             struct ColorMap *cm = WUD->scr->ViewPort.ColorMap;
  1042.             
  1043.             ReleasePen(cm,WUD->gray00);
  1044.             ReleasePen(cm,WUD->gray13);
  1045.             ReleasePen(cm,WUD->gray23);
  1046.             ReleasePen(cm,WUD->gray29);
  1047.             ReleasePen(cm,WUD->gray42);
  1048.             ReleasePen(cm,WUD->gray46);
  1049.             ReleasePen(cm,WUD->gray55);
  1050.             ReleasePen(cm,WUD->gray59);
  1051.         }
  1052.  
  1053.         if (WUD->tf) CloseFont(WUD->tf);
  1054.     
  1055.         FreeMem (WUD,sizeof(*WUD));
  1056.     }
  1057. }
  1058.  
  1059. int main ()
  1060. {
  1061.     Printf("*** MacWB 0.2 ***\nCopyright ©1996 by Daniel Balster\nAll Rights Reserved.\n");
  1062.  
  1063.     if (init())
  1064.     {
  1065.         Disable();
  1066.         OldVector1 = SetFunction (LIB1,VEC1,(ULONG(*)())&(NewVector1));
  1067.         OldVector2 = SetFunction (LIB2,VEC2,(ULONG(*)())&(NewVector2));
  1068.         CacheClearU();
  1069.         Enable();
  1070.  
  1071.         Wait (SIGBREAKF_CTRL_C);
  1072.         
  1073.         if (FindPort("SetMan"))
  1074.         {
  1075.             Disable();
  1076.             SetFunction (LIB1,VEC1,(ULONG(*)())(OldVector1));
  1077.             SetFunction (LIB2,VEC2,(ULONG(*)())(OldVector2));
  1078.             CacheClearU();
  1079.             Enable();
  1080.         }
  1081.         else Wait(SIGBREAKF_CTRL_F);    /* DO NOT SIGNAL THIS !! */
  1082.     }
  1083.     kill();
  1084.  
  1085.     return 0;
  1086. }
  1087.